package com.ftg.learn.chapter17.table;


import java.util.HashMap;
import java.util.Map;

/**
 * 目标 ：
 *   1. 学习map接口
 *   1.1 内部 接口  内部 类
 *   1.2 数组
 *   1.3 链表
 *   1.4 树
 *   --- 我们学习的所有java 基础知识就是为了面向对象服务的
 *   --- 我们学习的所有面向对象知识，就是为了自己动手实现特定功能服务的
 *   --- 栈  队列  链表  map
 *   2. 学习hashmap常用方法
 *   3. 解读hashmap底层
 *      3.1 拆解 数组 - 链表(tree_thresold :8) - 树(treeifbin)
 *   4. 面试题  hashmap hashtable ConcurrentHashMap(高)
 * @author KangJx
 * @date 2021/8/10
 */
public class LearnA {

    public static void main(String[] args) {
        /**
         * 集合  ： map -> entry
         * hahsmap
         */
        //map<k,v>
        //jdk.8 hashmap 底层采用的是  数组 + 链表(TREEIFY_THRESHOLD = 8)  + 红黑树
        //Basic hash bin node, used for most entries.  (See below for
        //map - hashmap(实现类) - node( implments entry)
        //hashmap里面全部都是用来操作node

        Map<String,Object> map = new HashMap<>(3);
//        map.table.length = tablesizefor(3);//4
//        map.size();个数
        map.put("姓名","康加修");
        map.put("性别","男");
        System.out.println(map.size());

        System.out.println(map.get("姓名"));

//        tab[i] = newNode(hash, key, value, null);
        //i 的范围是什么 ? 最小值 0
        //resize 是不是求map的初始大小


        //1、把自己的个人信息存储到map里面
        //2、再把三个人的信息存起来:
        //3、把班级j2107 和学生信息绑定到一起
        //4、对1里面的信息进行遍历
        //4.1  使用values
        //4.2  使用 keyset
        //4.3  使用entryset


        //面试题  ： hashmap为什么要采用数组加链表
        //面试题  ： hashmap是如何解决hash冲突的
//        1.7

//        1. 是不是也明白了什么叫hash冲突
//        2.不同的字符串是否可以返回 相同的hash码?
        System.out.println("ABCDEa123abc".hashCode());  // 165374702
        System.out.println("ABCDFB123abc".hashCode()); //  165374702

        //>>> 无符号右移，不管是正数还是负数  反正我要在高位补0
//        00000001
//        00000001
        //相同为零
        //不同为1
        System.out.println(1 ^ 1);
//        00000010
//        00000001
//        00000011
        System.out.println(2 ^ 1);

        /**
         * 这个代码块是做什么用的！？
         * 链表6 -8
         * 红黑树 ： 平衡二叉树
         *    ...
         */
//        给定一个数字n ,求n的下一个2的次幂
//        >> 减小一倍
//        << 放大一倍
        int cap = 17;
        int n = cap - 1;
        n |= n >>> 1;
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        System.out.println( (n < 0) ? 1 :  n + 1);

//        map.put("a","abcddb");
        int h;
        int hash = ("a" == null) ? 0 : (h = "a".hashCode()) ^ (h >>> 16);
        int i=0;
        i = (n - 1) & hash;
        System.out.println(i);


    }




}
